home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / perl / perl5a1.lha / perl5alpha1 / do / ghent < prev    next >
Encoding:
Text File  |  1992-08-15  |  2.1 KB  |  93 lines

  1. int
  2. do_ghent(which,gimme,arglast)
  3. int which;
  4. int gimme;
  5. int *arglast;
  6. {
  7.     register ARRAY *ary = stack;
  8.     register int sp = arglast[0];
  9.     register char **elem;
  10.     register STR *TARG;
  11.     struct hostent *gethostbyname();
  12.     struct hostent *gethostbyaddr();
  13. #ifdef HAS_GETHOSTENT
  14.     struct hostent *gethostent();
  15. #endif
  16.     struct hostent *hent;
  17.     unsigned long len;
  18.  
  19.     if (which == O_GHBYNAME) {
  20.     char *name = str_get(ary->ary_array[sp+1]);
  21.  
  22.     hent = gethostbyname(name);
  23.     }
  24.     else if (which == O_GHBYADDR) {
  25.     STR *addrstr = ary->ary_array[sp+1];
  26.     int addrtype = (int)str_gnum(ary->ary_array[sp+2]);
  27.     char *addr = str_get(addrstr);
  28.  
  29.     hent = gethostbyaddr(addr,addrstr->str_cur,addrtype);
  30.     }
  31.     else
  32. #ifdef HAS_GETHOSTENT
  33.     hent = gethostent();
  34. #else
  35.     fatal("gethostent not implemented");
  36. #endif
  37.  
  38. #ifdef HOST_NOT_FOUND
  39.     if (!hent)
  40.     statusvalue = (unsigned short)h_errno & 0xffff;
  41. #endif
  42.  
  43.     if (gimme != G_ARRAY) {
  44.     astore(ary, ++sp, TARG = str_mortal(&str_undef));
  45.     if (hent) {
  46.         if (which == O_GHBYNAME) {
  47. #ifdef h_addr
  48.         str_nset(TARG, *hent->h_addr, hent->h_length);
  49. #else
  50.         str_nset(TARG, hent->h_addr, hent->h_length);
  51. #endif
  52.         }
  53.         else
  54.         str_set(TARG, hent->h_name);
  55.     }
  56.     return sp;
  57.     }
  58.  
  59.     if (hent) {
  60. #ifndef lint
  61.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  62.     str_set(TARG, hent->h_name);
  63.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  64.     for (elem = hent->h_aliases; *elem; elem++) {
  65.         str_cat(TARG, *elem);
  66.         if (elem[1])
  67.         str_ncat(TARG," ",1);
  68.     }
  69.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  70.     str_numset(TARG, (double)hent->h_addrtype);
  71.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  72.     len = hent->h_length;
  73.     str_numset(TARG, (double)len);
  74. #ifdef h_addr
  75.     for (elem = hent->h_addr_list; *elem; elem++) {
  76.         (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  77.         str_nset(TARG, *elem, len);
  78.     }
  79. #else
  80.     (void)astore(ary, ++sp, TARG = str_mortal(&str_no));
  81.     str_nset(TARG, hent->h_addr, len);
  82. #endif /* h_addr */
  83. #else /* lint */
  84.     elem = Nullch;
  85.     elem = elem;
  86.     (void)astore(ary, ++sp, str_mortal(&str_no));
  87. #endif /* lint */
  88.     }
  89.  
  90.     return sp;
  91. }
  92.  
  93.